/**
 * axios封装
 * 请求拦截、响应拦截、错误统一处理
 */
import axios from "axios";
// 此路径为配置代理服务器时的代理路径
axios.defaults.baseURL = "/api";
// // 创建axios实例
// var instance = axios.create({timeout: 1000*12})
// // 设置post请求头
// instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'

/**
 * 请求拦截器
 * 每次请求前，如果存在token则在请求头中携带token
 */
axios.interceptors.request.use(
  config => {
  // 登录流程控制中，根据本地是否存在token判断用户的登录情况
  // 但是即使token存在，也有可能token是过期的，所以在每次的请求头中携带token
  // 后台根据携9带的token判断用户的登录情况，并返回给我们对应的状态码
  // 而后我们可以在响应拦截器中，根据状态码进行一些统一的操作。
  console.log(config);
  config.headers.Authorization = window.sessionStorage.getItem('token');
  return config;
});

export default{
  // axios.get(url[, config]), 服务端将params作为url参数来接受，则请求的url为:www.demo/url?a=1&b=2形式,切记，get方法用params
  get(url, params, responseType){
    return new Promise((resolve, reject) => {
      axios({
        method:'get',
        url,
        params,
        headers:{
          Accept:'application/json','Content-Type':'application/json;charset=utf-8',
          withCredentials: true // 是否跨域
        },
        // 默认json格式，如果是下载文件，需要传responseType:'blob'
        responseType:(responseType==null || responseType == '')? 'json' : responseType
      }).then(response => {
        if(response.status == 200){
          // 根据实际情况进行修改
          resolve(response)
        } else{
          reject(response)
        }
      })
    })
  },
  // axios.post(url[, data[, config]]), post方法用data来封装参数，参数写在了body中
  post(url, data, responseType){
    return new Promise((resolve, reject) => {
      axios({
        method:'post',
        url,
        data,
        headers:{
          Accept:'application/json','Content-Type':'application/json;charset=utf-8',
          withCredentials: true
        },
        responseType:(responseType==null || responseType=='')? 'json': responseType
      }).then(response => {
        if(response.status == 200){
          resolve(response)
        } else{
          reject(response)
        }
      })
    })
  },
  // axios.put(url[, data[, config]]), put方法用data来封装参数，参数写在body中
  put(url, data, responseType){
    return new Promise((resolve, reject) => {
      axios({
        method:'put',
        url,
        data, // 此处为简写，完整写法为：data:params
        headers:{
          Accept:'application/json','Content-Type':'application/json;charset=utf-8',
          withCredentials: true
        },
        responseType: (responseType==null || responseType == '')? 'json': responseType
      }).then(response => {
        if(response.status == 200){
          resolve(response)
        } else {
          reject(response)
        }
      })
    })
  }
}

